流程控制之前先進指標,有學過程式的應該都知道,指標有點麻煩而且難學,要去理解記憶體位置與數值之間的關係,當指標來回指來指去時就會很亂又很難除錯
圖源:https://memes.tw/wtf/415072#!
在電腦科學中,指標(英語:Pointer),是程式語言中的一類資料類型及其物件或變數,用來表示或儲存一個記憶體位址。而此位址的值直接指向(points to)存在該位址的物件的值。
為什麼要使用指標?
Go 是一個 pass by value 的程式語言,也就是每當我們把值放入函式中時,Go 會把這個值完整的複製一份,並放到新的記憶體位址,不會對原本的值做變更
對pass by value不大了解的可以看一下這篇文章的介紹
var ptr *int //宣告一個指向int的指標變數ptr
fmt.Printf("%p \n", ptr) // 0x0 尚未賦值
if ptr == nil {
fmt.Println("ptr is nil") //ptr is nil
}
未指派記憶體位置時為nil,指派後即為記憶體位置。nil在概念上和其它语言的null、None、NULL一样,都指零值或空值。
score := 75
var ptr *int //宣告一個指向int的指標變數ptr
ptr = &score
fmt.Println(score) // 75
fmt.Println(&score) // 0xc000122058
fmt.Println(ptr) // 0xc000122058
fmt.Println(*ptr) // 75
&
可以對變數取得記憶體位置,*
可對記憶體位置獲取存放的數值。想寫一個加法的程式,不使用指標時就必須使用return
的方式更改原變數的值,如下
func plus10(a int) int{
return a+10
}
func main() {
score := 75
score = plus10(score) // plus10傳回新值並並賦予score
fmt.Println(score) //85
}
若使用指標寫法,就可直接變更傳入參數之值。
func plus_10(a *int) {
*a = *a + 10
}
func main() {
score := 75
plus_10(&score)
fmt.Println(score) //85
}
由於沒有到很熟,指標不確定要介紹多少東西,就先到這邊就好,可以看一下其他前輩是如何介紹指標的,還有指標的各種相關功能。
[Golang] 程式設計教學:使用指標 (Pointer)
https://opensourcedoc.com/golang-programming/pointer/
[Golang] 指標 Pointers
https://pjchender.dev/golang/pointers/
#10 指標 Pointer | Golang魔法使
https://ithelp.ithome.com.tw/articles/10235479